package org.com.liurz.iresources.activiti.listener;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.impl.el.FixedValue;
import org.com.liurz.iresources.activiti.constant.FlowConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 节点监听器:初了会签监听器外，每个节点都有配置。
 * 配置监听器：主要是自定义了记录流程信息、待处理任务节点。为了activiti单纯执行流程流转
 * 配置时：配置为ALL,这样可以监听到创建新节点，删除当前节点等
 */
@Service("NodeTaskListener")
public class NodeTaskListener extends BasicTaskListener{

    // 处理人
    private FixedValue user; // 同流程图中fieldName

    // 处理角色
    private FixedValue role;

    // 下个节点是否存在会签节点
    private FixedValue is_signer;

    // 会签用户配置
    private FixedValue signer_user;

    @Autowired
    private RuntimeService runtimeService;

    // 当前节点的下个节点为会签节点时，动态注入会签节点处理人,目前只針對配置的用戶。
    // 如果角色的話需要進一步處理
    @Override
    protected void setSignerTaskNodeHandler(DelegateTask delegateTask) {
      if(null == is_signer){
          return;
      }
      Object isSignerObj=  is_signer.getValue(delegateTask);
      String isSigner= String.valueOf(isSignerObj);
      if(!"true".equalsIgnoreCase(isSigner)){
          return;
      }
        logger.info("next node exsit signer node");
        Object signerUserObj=  signer_user.getValue(delegateTask);
        String signerUser= String.valueOf(signerUserObj);
        String[] users = signerUser.split(",");
        Map<String,Object> signerParam = new HashMap<String,Object>();
        signerParam.put(FlowConstant.SIGNERHANDLER,users);
        runtimeService.setVariables(delegateTask.getProcessInstanceId(),signerParam);
    }

    /**
     * 获取节点处理人
     * @param delegateTask
     * @return
     */
    @Override
    protected Set<String> getTaskCandidates(DelegateTask delegateTask) {
        List<String> users = new ArrayList<>();
        Object object =  user.getValue(delegateTask);
        if(null != object){
            String userValueStr=String.valueOf(object);
            String[] userIds = userValueStr.split(",");
            users.addAll(Arrays.asList(userIds));
        }
        Set<String> result = new HashSet<>();
        for (String string : users) {
            result.add(string);
        }
        return result;
    }
}
